<?php
/**
 * Controller_Base
 *
 * Класс Controller_Base отвечает за базовую работу всех контроллеров
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
abstract class Controller_Base {

	// Стандартные атрибуты. Используются во все проектах
  protected $showAnalytics = true; // Флаг, выводить или нет код гугл-аналитикс
  protected $isPrint = ''; // Флаг, является ли данная страница страницей для печати
  protected $title = ''; // Мета-тайтл страницы
	protected $pageHead = ''; // Главный заголовок страницы
	protected $bodyAttrs = ''; // атрибуты тега body
	protected $keywords = null; // мета-ключевые слова
	protected $description = null; // мета-описание
	protected $pageDescription = null; // Описание страницы - стандартно выводится под заголовком страницы
	protected $arrCss = array(
	  'reset.css',
	  'plugins/pop_up_box.css',
	  'base.css'
	);
	protected $arrJs = array(
		'config.js',
	  'plugins/jquery.js',
	  'plugins/jquery.templates.js',
	  'plugins/pop_up_box.js',
	  'base.js'
	); // список подключаемых js-файлов
	protected $arrRequest = array(); // Массив, содержащий информацию о запросе к странице (элементы массива  - то что между слешами в URL)
	protected $jsReady; // JS-код, который будет автоматически вызван при загрузке страницы
	protected $arrAdditional = array(); // в этом массив можно вносить строки любых мета-тегов. Он будет выведен внутри элемента haed
	protected $showUserMessagesInStandardPlace = true; // Флаг, определяющий выводить ли системные сообщения о выполнении действий пользователю в стандартном месте
	protected $arrUserVars = array(); // Хранилище для пользовательских переменных. Например, для флагов свернуто/развернуто
  protected $showLeftColumn = false; // Флаг, указывающий, нужно ли выводить левую колонку
  protected $showRightColumn = false; // Флаг, указывающий, нужно ли выводить левую колонку
  // Атрибуты, связанные с постраничным выводом
  protected $pageLimit = 20;            // Кол-во элементов на страницу
  protected $editLimit = 10;						// Кол-во элементов при редаактировании
  protected $id = 0;										// Текущий элемент
  protected $pageNum = 1;               // Текущая страница
  protected $elementsInListAmount = 0;  // Количество элементов в списке для постраничного вывода
  protected $pageUrlsInGet = true;      // Номер страницы передавать в GET
  protected $isPageInUrl = false;       // Номер страницы уже фигурирует в URL. Требуется только тогда, когда $pageUrlsInGet == false
  protected $editUrl = null;            // Ссылка на редактирование. Если ее задать в заголовке автоматически появится "ред."
  protected $addUrl = null;             // // Ссылка на добавление. Если ее задать в заголовке автоматически появится "Добавить"
  protected $mainActionHtml = null;     // HTML код основной ссылки - будут вставляться в div с float right в основном заголовке
  public $error = 0;
  protected $showLeftMenu = true; // выводить левое меню или нет
  protected $city = null;    // Город (на английском/транслит)
  protected $cityName = null;// Название города (на русском)
  protected $cityUrl = null; // URL города для переходов
  protected $showCrumbsInStandardPlace = true; // Флаг, выводить ли хлебные крошки
  protected $arrCrumbs = array(array('name' =>  'Главная страница', 'url' => W_ABSPATH)); // Массив хлебных крошек

	/**
	 * Конструктор контроллера
	 *
	 * @param array $arrRequest - массив, содержащий информацию о запросе к странице (элементы массива  - то что между слешами в URL)
	 */
	public function __construct(&$arrRequest) {
	  Service_Debug::setDebug();
		$this->arrRequest = &$arrRequest;
		/*
		if (DEBUG) {
			$this->addJs('plugins/debug.js');
			$this->addCss('plugins/debug.css');
			if(!in_array('plugins/jquery.keyboard.js', $this->arrJs)) {
				$this->addJs('plugins/jquery.keyboard.js');
			}
			$this->addJsReady("
				$(document).keyboard(
					'd+b+g',
					{strict : false},
					function () {
						if ($('#debug:visible').length) $('#debug').hide();
						else {
							$('#debug').show();
							$('.debugHidden').hide();
						}
					}
				);
				$(document).keyboard(
					'j+d+b',
					{strict : false}, jDebug
				);
			");
		}*/
	}


	/**
	 * Выбираем действие в зависимости от URL в $this->arrRequest (Переопределяется в наследуемых классах)
	 *
	 */
	public function action() {
		$this->setError(404);
	}



	/**
	 * Метод выводит метаданные
	 *
	 */
	public function showMetas() {
	  Service_Debug::setDebug();
		?>
        <?php if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') === FALSE) echo '<!DOCTYPE html>' ?>
<html lang="ru">
<head>
<title><?php echo $this->title;?></title>

<meta http-equiv="content-language" content="ru" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="author" content="Kouzma" />
<link rel="shortcut icon" href="/content/images/favicon.ico"	type="image/x-icon" />
<?php if (isset($this->keywords))	echo '<meta name="keywords" content="' . $this->keywords . '" />';
	  	if (isset($this->description)) echo '<meta name="description" content="' . $this->description . '" />';
	  	foreach ($this->arrCss as $cssFile)	echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . $cssFile . '" />' . "\n";
	    foreach ($this->arrJs as $jsFile) echo '<script type="text/javascript" src="' . W_JS . $jsFile . '"></script>' . "\n";
			foreach ($this->arrAdditional as $additional)	echo $additional;
			
			if (isset($this->jsReady)) {
				echo '<script type="text/javascript">';
					echo '$().ready(function() {';
						echo $this->jsReady;
					echo '});';
				echo '</script>';
			}
			
      echo '<!--[if IE]>';
        echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . 'ie.css" />';
      echo '<![endif]-->';
      echo '<!--[if lt IE 9]>';
        echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . 'ie_8.css" />';
      echo '<![endif]-->';
      echo '<!--[if lt IE 8]>';
        echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . 'ie_7.css" />';
      echo '<![endif]-->';
      echo '<!--[if lt IE 7]>';
        echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . 'ie_6.css" />';
      echo '<![endif]-->';
?>
</head>
<body <?php $this->bodyAttrs; ?>>
<div class="all">
<?php
	}

  /**
   * Метод добавляет css файл к общему массиву
   *
   * @param string $cssFileName
   */
	public function addCss($cssFileName) {
  	$this->arrCss[] = $cssFileName;
  }
  /**
   * Метод добавляет js файл к общему массиву
   *
   * @param string $jsFileName
   */
	public function addJs($jsFileName) {
  	$this->arrJs[] = $jsFileName;
  }
  /**
   * Метод добавляет очередную хлебную крошки к общему массиву
   *
   * @param string $arrCrumb
   */
	public function addCrumb($name, $url = null, $noLinkIfLast = false) {
  	$arrCrumb = array();
  	$arrCrumb['name'] = $name;
  	$arrCrumb['url'] = $url;
  	$arrCrumb['no_link_if_last'] = $noLinkIfLast;
	  $this->arrCrumbs[] = $arrCrumb;
  }
  /**
   * Метод устанавливает хлебные крошки
   *
   * @param string $arrCrumbs
   */
	public function setCrumbs($arrCrumbs) {
  	$this->arrCrumbs = $arrCrumbs;
  }
  /**
   * Метод добавляет доплнительный код в метатеги
   *
   * @param string $additional
   */
	public function addAdditional($additional) {
  	$this->arrAdditional[] = $additional;
  }
  /**
   * Метод задает js код, который будет выполняться при загрузке страницы
   *
   * @param string $jsReadyText
   */
	public function setJsReady($jsReadyText) {
  	$this->jsReady = $jsReadyText;
  }

  /**
   * Метод добавляет js код, который будет выполняться при загрузке страницы
   *
   * @param string $jsReadyText
   */
  public function addJsReady($jsReadyText) {
    if (!isset($this->jsReady)) $this->jsReady = $jsReadyText;
    else $this->jsReady .= $jsReadyText;
  }

  /**
   * Метод закрывает html-код
   *
   */
	public function showClose() {
	  Service_Debug::setDebug();
	  if ($this->showAnalytics) {

    }
    if (DEBUG) {
    	$objDebug = Service_Debug::instance();
			$objDebug->echoDebug();
    }
    echo '</div>'; // Закрываем <div class="all">
    echo '</body>';
		echo '</html>';
	}


	/**
	 * Выводит шапку
	 *
	 */
	public function showHeader() {
	  Service_Debug::setDebug();
  	$this->showMetas();    // вывод метатегов
		$this->showTop();      // вывод верхней части

		if ($this->showCrumbsInStandardPlace) $this->showCrumbs();
		
		// вывод основного заголовка
		if ($this->pageHead != '') {
      $this->showH1($this->pageHead);
		}

		// вывод сообщения об ошибке
		if ($this->showUserMessagesInStandardPlace) {
			if (User_Flash::_get('successMessage')) View_User::showUserMessage(User_Flash::_get('successMessage'), 1);
			if (User_Flash::_get('errorMessage')) View_User::showUserMessage(User_Flash::_get('errorMessage'), -1);
		}
  }

  /**
   * Метод выводит хлебные крошки
   *
   */
  public function showCrumbs() {
    $crumbsSize = sizeof($this->arrCrumbs);
    if ($crumbsSize) echo '<div id="crumbs">';
    for ( $i = 0; $i < $crumbsSize; $i++) {
      if (isset($this->arrCrumbs[$i]['url']) && $_SERVER['REQUEST_URI'] != $this->arrCrumbs[$i]['url'] && (!isset($this->arrCrumbs[$i]['no_link_if_last']) || !$this->arrCrumbs[$i]['no_link_if_last'])) {
        echo '<a href="' . $this->arrCrumbs[$i]['url'] . '">';
      }
  	  echo $this->arrCrumbs[$i]['name'];
      if (isset($this->arrCrumbs[$i]['url']) && $_SERVER['REQUEST_URI'] != $this->arrCrumbs[$i]['url'] && (!isset($this->arrCrumbs[$i]['no_link_if_last']) || !$this->arrCrumbs[$i]['no_link_if_last'])) {
        echo '</a>';
      }
      if ($i < $crumbsSize - 1) echo '<img src="' . W_IMAGES . 'icons/separator/arrow.gif" class="arrowSeparator" alt="" />';
  	}
  	if ($crumbsSize) echo '</div>';
  }
  
  /**
   * Метод выводит стандартный заголовок
   *
   * @param string $pageHead
   * @param string $editUrl
   */
  public function showH1($pageHead = null, $editUrl = null) {
	  if(empty($pageHead)) $pageHead = $this->pageHead;
	  if(empty($editUrl)) $editUrl = $this->editUrl;
	  if (!empty($this->addUrl)) echo '<p id="mainAdd"><a href="' . $this->addUrl . '"><img src="' . W_IMAGES . 'button/add.gif" alt="Добавить" /></a></p>';
	  echo '<h1>';
	  	if($pageHead == "Контактная информация") echo $pageHead = str_replace(' ', '<br />', $pageHead);
	    else echo $pageHead;
	    if (!empty($editUrl)) echo ' (<a href="' . $editUrl . '">edit</a>)';
	  echo '</h1>';
	  if(!empty($this->pageDescription)) echo '<h3 class="col-2">' . $this->pageDescription . '</h3>';
  }

  /**
   * Выводит подвал
   *
   */
  public function showFooter() {
    Service_Debug::setDebug();
  	$this->showBasement();
  	$this->showClose();
  }

  /**
   * Выводит верхнюю часть
   *
   */
  public function showTop() {
    Service_Debug::setDebug();
    $objCityUrl = new CityUrl();
    $arrCitiesWithCountries = $objCityUrl->getCitiesWithCountries();
    
    echo '<header id="top">';
      echo '<div class="left">'; 
	      echo '<p id="logo">';
	        echo '<a href="' . W_ABSPATH . '">Свадебная страна</a>';
	      echo '</p>';
	      echo '<p id="slogan">Заказывай услуги напрямую!</p>';
      echo '</div>';
      echo '<div class="right">';
	      View_Block::showCurrentCity($this->cityName);
	      View_Block::showChoose($arrCitiesWithCountries, $this->city, join('/', array_unique($this->arrRequest)));
				View_Block::showSmallAuthBlock();
	    echo '</div>';
      echo '<nav><ul>';
        echo '<li class="mMenu"><a href="' .  W_ABSPATH . $this->cityUrl . 'zags/">Загсы</a></li>';
        echo '<li class="mMenu"><a href="' .  W_ABSPATH . $this->cityUrl . '">Фотографы</a></li>';
        echo '<li class="mMenu"><a href="' .  W_ABSPATH . $this->cityUrl . '">Заявки</a></li>';
      echo '</ul></nav>';
    echo '</header>';
  }

  /**
   * Выводит нижнюю часть
   *
   */
  public function showBasement() {
    Service_Debug::setDebug();
    $objArt = new Article();
    $arrArt = $objArt->find('all', array('conditions' => '`is_for_basement` =1'));
    echo '<br />', 'Подвал:', '<br />';
    foreach ($arrArt as $key1 => $tempArr) 
		foreach ($tempArr as $key2 => $val)
			switch($key2) {
				case 'article_name':
					$tempStr = $val;
					break;
				case 'article_alias':
					$articleURL = W_ABSPATH . 'article/'. $val;
					echo '<a href=', $articleURL, '>';
					echo $tempStr;
					echo '</a>';
					echo '<br />';
					break;
			}
  }

  /**
   * Выводит левую часть
   *
   */
  public function showLeft() {
  	echo '<div id="left">';
      echo 'Left column';
  	echo '</div>';
  }

  /**
   * Выводит правую часть
   *
   */
  public function showRight() {
  	echo '<div id="right">';
      echo 'Right column';
  	echo '</div>';
  }

	/**
	 * Метод создает сообщение об ошибке
	 *
	 */
	public function setError($error) {
		$this->error = $error;
		$this->showError();
	}

	/**
	 * Метод выводит сообщение об ошибке
	 *
	 */
	public function showError() {
		switch ($this->error) {
			case 404:
				$this->pageHead = $this->title = 'Такая страница не существует.';
				break;
			case 403:
				$this->pageHead = $this->title = 'Недостаточно прав для просмотра страницы.';
				break;
			case 'auth':
				$this->pageHead = $this->title = 'Для просмотра этой страницы требуется авторизация';
				$this->showHeader();
				$this->showFooter();
				exit();
				break;
			default:
				$this->pageHead = $this->title = 'Произошла неивезстная ошибка.';
				break;
		}

    $this->showHeader();
		$this->showFooter();
		exit();
	}



		/**
	 * Метод добавляет метатеги для отображения альбомов
	 *
	 */
	public function addMetasForAlbumView() {
	  $this->addJs('plugins/j_scroll_pane.js');
	  $this->addCss('plugins/j_scroll_pane.css');
	  
	  $this->addJs('album_view.js');
	  $this->addCss('album_view.css');
	}

  /**
   * Формирует url без GET параметров
   *
   * @return string
   */
  public function getCurrentUrl() {
    $urlBeforePageNummber = W_ABSPATH;
    //Формируем основной URL (то, что до символа "?")
    if (!empty($this->arrRequest)) {
      foreach ($this->arrRequest as $urlWord) {
        if (!empty($urlWord)) $urlBeforePageNummber .= $urlWord . '/';
      }
    }
    return $urlBeforePageNummber;
  }

  /**
   * Задает город, и url города для переходов 
   * 
   * @param string $city
   * @param string $cityName
   */
  public function setCity($city = null, $cityName = null) {
    $this->city = $city;
    $this->cityName = $cityName;
    $this->cityUrl = $city ? $city . '/' : null;
  }
  
/**
   * Метод добавляет js и css файлы для работы редактора WYSIWYG
   *
   */
	public function addWysiwygMetas() {
		$this->arrCss[] = 'elrte.min.css';
		$this->arrCss[] = 'smoothness/jquery-ui-1.8.13.custom.css';
		$this->arrCss[] = 'elfinder.css';
		
		$this->arrJs[] = 'jquery-ui-1.8.13.custom.min.js';
		$this->arrJs[] = 'elrte.min.js';
		$this->arrJs[] = 'i18n/elrte.ru.js';
		$this->arrJs[] = 'elfinder.min.js';
		$this->arrJs[] = 'elfinder_start.js';
  }
  	
}
?>
